////////////////////////////////////////////////////////////////////////////////
//
//  FLEX USER GROUP HOKURIKU
//  Copyright 2009 Flex User Group Hokuriku
//  All Rights Reserved.
// 
//  NOTICE: Flex User Group Hokuriku permits you to use, 
//  modify, and distribute this file 
//  in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////
package net.fxug.hokuriku.as3tnd.utils
{
    import com.adobe.utils.DateUtil;
    
    import flash.errors.IllegalOperationError;
    
    import net.fxug.hokuriku.as3tnd.model.EventResult;
    import net.fxug.hokuriku.as3tnd.model.AttendanceDetailResult;
    import net.fxug.hokuriku.as3tnd.model.AttendanceResult;

    /**
     * JSONデータ変換用ユーティリティ
     * @author hikaruworld
     */
    public class JSONDataParser
    {

        /** 
		 * デフォルトコンストラクタは使用禁止
         * @throws IllegalOperationError インスタンス生成が行われた場合にthrowされます。
		 */
        [Deprecated("このクラスのインスタンス化は禁止されています。")]
        public function JSONDataParser()
        {
            throw new IllegalOperationError("このクラスのインスタンス化は許可されていません。")
        }

        //---------------------------------------------------------------------
        // ATND系JSONデータ変換メソッド
        //---------------------------------------------------------------------
        /**
         * イベントサーチの検索結果を検索結果オブジェクトに格納して返す。
         * @param obj  ATNDのイベント検索結果のレスポンスデータのjson形式
         * @return EventSearchResultの配列
         */
        public static function parseEventsSearchResultArray(responseJSON:Object):Array
        {
            var ret:Array = [];

            var index:int = responseJSON.events.length;
            for (var i:int = 0; i < index; i++)
            {
                var tmp:EventResult = JSONDataParser.parseEventSearchResult(responseJSON.events[i]);
                ret.push(tmp);
            }
            return ret;
        }

        /**
         * イベントサーチの検索結果を検索結果オブジェクトに格納して返す。
         * @param obj  ATNDのイベント検索結果のレスポンスデータのjson形式
         * @return EventSearchResultの配列
         */
        public static function parseUsersSearchResultArray(responseJSON:Object):Array
        {
            var ret:Array = [];

            var index:int = responseJSON.events.length;
            for (var i:int = 0; i < index; i++)
            {
                var tmp:AttendanceResult = JSONDataParser.parseUserSearchResult(responseJSON.events[i]);
                ret.push(tmp);
            }
            return ret;
        }

        /**
         * ATNDイベント検索のイベント単位のJSON形式のデータをATNDEventSearchResultに変換して返す。
         * @param obj JSON形式のObject
         * @return ATNDEventSearchResult形式に変換されたオブジェクト
         */
        private static function parseEventSearchResult(eventJSON:Object):EventResult
        {
            var ret:EventResult = new EventResult();
            if (eventJSON == null)
            {
                return ret;
            }
            ret.eventId = eventJSON.event_id;
            ret.title = eventJSON.title;
            ret.catchcopy = eventJSON["catch"];
            ret.description = eventJSON.description;
            ret.eventURL = eventJSON.event_url;
            ret.startedAt = DateUtil.parseW3CDTF(eventJSON.started_at);
            ret.endedAt = DateUtil.parseW3CDTF(eventJSON.ended_at);
            ret.url = eventJSON.url;
            ret.limit = eventJSON.limit as int;
            ret.address = eventJSON.address;
            ret.place = eventJSON.place;
            ret.lat = eventJSON.lat as uint;
            ret.lon = eventJSON.lon as uint;
            ret.ownerId = eventJSON.owner_id as int;
            ret.ownerNickName = eventJSON.owner_nickname;
            ret.accepted = eventJSON.accepted as int;
            ret.waiting = eventJSON.waiting as int;
            ret.updatedAt = DateUtil.parseW3CDTF(eventJSON.updated_at);

            return ret;
        }

        /**
         * ATND出欠検索のイベント単位のJSON形式のデータをATNDUserSearchResultに変換して返す。
         * @param obj JSON形式のObject
         * @return ATNDUserSearchResult形式に変換されたオブジェクト
         */
        private static function parseUserSearchResult(userJSON:Object):AttendanceResult
        {
            var ret:AttendanceResult = new AttendanceResult();
            if (userJSON == null)
            {
                return ret;
            }
            ret.eventId = userJSON.event_id;
            ret.title = userJSON.title;
            ret.eventURL = userJSON.event_url;
            ret.limit = userJSON.limit as int;
            ret.accepted = userJSON.accepted as int;
            ret.waiting = userJSON.waiting as int;
            ret.updatedAt = DateUtil.parseW3CDTF(userJSON.updated_at);

            // ユーザ情報
            var tmAry:Array = userJSON.users;
            var userRet:Array;
            if (tmAry == null || tmAry.length == 0)
            {
                userRet = [];
            }
            else
            {
                var index:int = tmAry.length;
                for (var i:int = 0; i < index; i++)
                {
                    var userDeta:AttendanceDetailResult = new AttendanceDetailResult();
                    userDeta.userId = tmAry[i].user_id;
                    userDeta.nickname = tmAry[i].nickname;
                    userDeta.status = tmAry[i].status as int;
                    userRet.push(userDeta);
                }
            }
            ret.users = userRet;
            return ret;
        }
    }
}
